	package fr.auzaiphe.joueur.view;

import java.awt.CardLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

import fr.auzaiphe.admin.constantes.ConstantesAdmin;
import fr.auzaiphe.commun.FenetreVisu;
import fr.auzaiphe.commun.FenetreVisuInfo;
import fr.auzaiphe.commun.SoundPlayer;
import fr.auzaiphe.commun.View;
import fr.auzaiphe.joueur.controller.JoueurController;
import fr.auzaiphe.joueur.model.JoueurModel;

/**
 *
 * @author Hugp
 *
 */
public class JoueurView extends View
{
	private JPanel mainPanel;

	public static final int REFRESH_INDICE = 0;
	public static final int REFRESH_JOUEUR = 1;
	public static final int REFRESH_ALL = 3;

	private JoueurPanel panelNonConnecte;
	private JoueurPanelConnecte panelConnecte;

	private CardLayout cardLayout;
	/**
	 * Constructeur
	 * @param pModel
	 * @param pController
	 */
	public JoueurView ( JoueurModel pModel,
					    JoueurController pController )
	{
		this.model = pModel;
		this.controller = pController;

		this.fenetre = new JFrame("Murder Party");
		this.fenetre.setSize(800, 600);
		this.fenetre.setLocationRelativeTo( null );
		this.fenetre.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
		this.fenetre.addWindowListener ( new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				((JoueurController)JoueurView.this.controller).stopperPartie();
				System.exit(0);
			}
	    });

		this.mainPanel = new JPanel(new CardLayout());

		this.panelNonConnecte = new JoueurPanel( (JoueurController) this.controller );
		this.panelConnecte = new JoueurPanelConnecte((JoueurController) this.controller);

		this.mainPanel.add(this.panelConnecte,"0");
		this.mainPanel.add(this.panelNonConnecte,"1");
		this.fenetre.add( this.mainPanel );

		this.fenetre.setVisible(true);
		this.model.addObserver(this);
	}

	public JoueurPanelConnecte getPanelConnecte()
	{
 		return this.panelConnecte;
	}

	public JoueurPanel getPanelNonConnecte()
	{
		return this.panelNonConnecte;
	}

	/**
	* Appelée lorsque le modele se met à jour.
	*
	* @param pObservable
	* @param pObject
	*/
	@Override
	public synchronized void update( Observable pObservable,
						Object pObject )
	{
		int state = ( pObject != null ) ? (Integer) pObject : -1 ;
		this.model = (JoueurModel) pObservable;

		this.checkConnection();
		this.fenetre.validate();

		this.panelConnecte.setPrix(((JoueurModel)this.model).getPrix());

		// Raffraichissement de liste des joueurs de l'échange de temps
		/*if ( state == JoueurView.REFRESH_JOUEUR
			 || state == JoueurView.REFRESH_ALL )
		{
			this.panelConnecte.setListeJoueur( ( (JoueurModel) this.model ).getListeJoueurs(), ((JoueurModel) this.model).getJoueurConnecte() );
		}*/

		if ( ((JoueurModel)this.model).isConnected() )
		{
			this.panelConnecte.updateOnglets( (JoueurModel)this.model , state );
			this.panelConnecte.setTime( ((JoueurModel)this.model).getChronoPartie().getSecondesRestantes() );
			this.panelConnecte.setTimeJoueur( ((JoueurModel)this.model).getJoueurConnecte().getChronoJoueurConnecte().getSecondesRestantes() );
		}
		else
		{
			this.panelNonConnecte.setTime( ((JoueurModel)this.model).getChronoPartie().getSecondesRestantes() );
		}
	}

	@Override
 	public JTextArea getChat()
 	{
		return (((JoueurModel)this.model).isConnected()) ? this.panelConnecte.getChat() : this.panelNonConnecte.getChat();
	}

	private void checkConnection()
	{
		if(((JoueurModel)this.model).isConnected())
			((CardLayout)this.mainPanel.getLayout()).show(this.mainPanel,"0");
		else
			((CardLayout)this.mainPanel.getLayout()).show(this.mainPanel,"1");
	}

	public void afficherAlerte(String pTitre, String pTexte, String pLienFichier)
	{
		FenetreVisu fenetre = new FenetreVisu(this.getFenetre(), pTitre, new FenetreVisuInfo(pTitre,pTexte));
		fenetre.show();
		SoundPlayer son = new SoundPlayer(ConstantesAdmin.SND_POP);
		son.play();
	}
}
